/**
 * Project Name:Android_Car_Example
 * File Name:LocationTask.java
 * Package Name:com.amap.api.car.example
 * Date:2015年4月3日上午9:27:45
 */

package com.ysm.smfu.map;

import android.content.Context;
import android.text.TextUtils;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.ysm.smfu.utils.UIUtils;


/**
 * ClassName:LocationTask <br/>
 * Function: 简单封装了定位请求，可以进行单次定位和多次定位，注意的是在app结束或定位结束时注意销毁定位 <br/>
 * Date: 2015年4月3日 上午9:27:45 <br/>
 *
 * @author yiyi.qi
 * @see
 * @since JDK 1.6
 */
public class LocationTask implements AMapLocationListener,
        OnLocationGetListener {

    private AMapLocationClient mLocationClient;

    private static LocationTask mLocationTask;

    private Context mContext;

    private OnLocationGetListener mOnLocationGetlisGetListener;

    private RegeocodeTask mRegecodeTask;

    private LocationTask() {
        mLocationClient = new AMapLocationClient(UIUtils.getContext());
        mLocationClient.setLocationListener(this);
//        mRegecodeTask = new RegeocodeTask(UIUtils.getContext());
//        mRegecodeTask.setOnLocationGetListener(this);
    }

    public void setOnLocationGetListener(
            OnLocationGetListener onGetLocationListener) {
        mOnLocationGetlisGetListener = onGetLocationListener;
    }

    public static LocationTask getInstance() {
        if (mLocationTask == null) {
            mLocationTask = new LocationTask();
        }
        return mLocationTask;
    }

    /**
     * 开启单次定位
     */
    public void startSingleLocate() {
        //初始化AMapLocationClientOption对象
        AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
        //高精度定位模式：会同时使用网络定位和GPS定位，优先返回最高精度的定位结果，以及对应的地址描述信息。
//            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//            低功耗定位模式：不会使用GPS和其他传感器，只会使用网络定位（Wi-Fi和基站定位）；
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);

        //获取一次定位结果：
        //该方法默认为false。
        mLocationOption.setOnceLocation(true);
        //获取最近3s内精度最高的一次定位结果：
        //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。
        // 如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
        mLocationOption.setOnceLocationLatest(true);

        //设置是否返回地址信息（默认返回地址信息）
        mLocationOption.setNeedAddress(true);
        //设置是否强制刷新WIFI，默认为true，强制刷新。
        mLocationOption.setWifiActiveScan(false);

        //设置是否允许模拟位置,默认为false，不允许模拟位置
        mLocationOption.setMockEnable(false);

        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        mLocationClient.startLocation();
    }

    /**
     * 开启多次定位
     */
    public void startLocate() {

        AMapLocationClientOption option = new AMapLocationClientOption();
        option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        option.setOnceLocation(false);
        option.setInterval(8 * 1000);
        //设置是否允许模拟位置,默认为false，不允许模拟位置
        option.setMockEnable(false);
        mLocationClient.setLocationOption(option);
        mLocationClient.startLocation();
    }

    /**
     * 结束定位，可以跟多次定位配合使用
     */
    public void stopLocate() {
        mLocationClient.stopLocation();

    }

    /**
     * 销毁定位资源
     */
    public void onDestroy() {
        mLocationClient.stopLocation();
        mLocationClient.onDestroy();
        mLocationTask = null;
    }


    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        if (amapLocation != null && amapLocation.getErrorCode() == 0) {
            PositionEntity entity = new PositionEntity();
            entity.latitue = amapLocation.getLatitude();
            entity.longitude = amapLocation.getLongitude();

            if (!TextUtils.isEmpty(amapLocation.getAddress()))
                entity.address = amapLocation.getAddress();

            if (!TextUtils.isEmpty(amapLocation.getCity()))
                entity.city = amapLocation.getCity();
            mOnLocationGetlisGetListener.onLocationGet(entity);
        }
    }

    @Override
    public void onLocationGet(PositionEntity entity) {

        // TODO Auto-generated method stub

    }

    @Override
    public void onRegecodeGet(PositionEntity entity) {

        // TODO Auto-generated method stub

    }

}
